home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
64'er Special 18
/
64er_Magazin_Sonderheft_18_19xx_Markt__Technik_de_Side_A.d64
/
MPS 802 Ext.SRC.
(
.txt
)
< prev
next >
Wrap
Commodore BASIC
|
2022-10-26
|
8KB
|
311 lines
3 sys9*4096
5 .opt oo
10 in = $ee83;zeichen vom seriellen port lesen
20 out = $f35f;zeichen in ausgabepuffer
30 end = $ee66;sa bearbeitung beenden
40 port = $0240;memory manager
45 ;******** original betriebssystem *******
50 *= $4400 ; zeichensatz aendern
51 .byte $3c,$40,$8c,$92,$9e,$42,$3c,$00;klammeraffe
52 *= $4858
53 .byte $fe,$08,$14,$22,$00,$00,$00,$00;kleines k
60 *= $4a79;rom check umgehen
61 bne z1
62 z1 inc $00
70 *= $4ab1;memory management
71 lda #$01;bit 0 setzen ohne speicherverteilung
72 jsr z9;zu aendern
73 jsr $ec61;initialisieren der ports
80 *= $5b02;memory management
81 lda port;low impuls von 12 taktzyklen
82 and #$fe; auf bit 0 legen ohne speicher
83 sta port; verteilung zu aendern
84 ora #$01
85 jsr z2
90 *= $5d01;*** memory management ***
91 z9 ora port
92 z2 sta port
93 rts
100 ;******** spezial betriebssystem *******
101 *= $6400 ; zeichensatz aendern
110 .byte $3c,$40,$8c,$92,$9e,$42,$3c,$00;klammeraffe
120 *= $6858
130 .byte $fe,$08,$14,$22,$00,$00,$00,$00;kleines k
150 *= $6a79;rom check umgehen
160 bne i1
170 i1 inc $00
200 *= $6ab1;memory management
210 lda #$01;bit 0 setzen ohne speicherverteilung
220 jsr j9;zu aendern
230 jsr $ec61;initialisieren der ports
300 *= $6bbe;rev 7x
310 .byte $37,$58
400 *= $6d2c;anzahl der zulaessigen sa
410 .byte $10
500 *= $6d3d;sa tabelle
510 .word j2-1,$edb8,$edbb,$edf2,$ee00
520 .word $ee09,$ee22,$ee29,j3-1,$ee41
530 .word $ee4a,j4-1,j5-1,$ee35,j6-1,j7-1
600 *= $6d69;abfrage auf neue steuerzeichen
610 jsr j1
700 *= $6e36;sa 13 speicherverteilung festlegen
710 lda $64;code holen
720 ora #01;bit 0 muss gesetzt bleiben
730 nop
740 nop
750 sta port;selektion gueltig
760 jmp end;muss unbedingt hier stehen
800 *= $7660;paperfeed routine
810 jmp j8;zur erweiterung
820 nop
900 *= $7b02;memory management
910 lda port;low impuls von 12 taktzyklen
920 and #$fe; auf bit 0 legen ohne speicher
930 sta port; verteilung zu aendern
940 ora #$01
950 jsr a1
1000 *= $7d01;*** memory management ***
1010 j9 ora port
1020 a1 sta port
1030 rts
1100 ;*** paperfeed ***
1110 j8 lda $60;paging off
1120 bmi b1;ja, dann neue routine
1130 jmp $f664;sonst wie gehabt
1140 b1 lda #$ff;vorschub von 255 zeilen anstossen
1150 jsr $f646
1160 lda #$08
1170 b2 bit $0280;paperfeedtaste gedrueckt
1180 beq b2;ja, dann weiter warten
1190 lda #$00;sonst motor abwuergen
1200 sta $92
1210 rts
1300 ;*** anfang von sa0 ***
1310 j2 lda $64;wie bisher, musste nur platz
1320 bit $0202;fuer sa-tabellenerweiterung machen
1330 bpl c1
1340 ldy #$00
1350 sty $87
1360 c1 jmp $ed5e
1400 ;*** sa8 weil dort jetzt sa13 ***
1410 j3 bit $0202
1420 bmi d1
1430 lda #$00
1440 sta $87
1450 d1 jmp end
1500 ;*** sa11 rom ins ram ***
1510 j4 ldy #$00;kopieren von e400 bis ffff
1520 sty $80; lowbyte
1530 lda #$e4
1540 sta $81; highbyte
1550 e1 lda ($80),y;rom lesen
1560 sta ($80),y;in ram schreiben, umschaltung durch
1570 iny; memory manager
1580 bne e1
1590 inc $81
1600 bne e1
1610 beq d1
1700 ;*** sa12 in ram schreiben ***
1710 j5 lda $64;lowbyte der anfangsadresse holen
1720 sta $7e
1730 jsr in;highbyte holen
1740 bvs f1;schon andere sa ja, dann fehler
1750 lda $64
1760 sta $7f
1770 f3 jsr in;zeichen lesen
1780 bvs f2;ende, wenn neue sa kommt
1790 lda $64
1800 ldx #$00
1810 sta ($7e,x);zeichen in ram
1820 inc $7e
1830 bne f3;naechstes zeichen
1840 inc $7f
1850 bne f3;naechstes zeichen
1860 jmp $ed23;ramtop erreicht, ende
1870 f1 jmp $ee80;terminator error
1880 f2 jmp $ed26;regulaeres ende
3000 ;*** sa14 8bit graphik ***
3010 j6 lda port
3020 and #$ef
3030 sta port;ram im zeichensatzbereich einschalten
3040 lda #$12
3050 sta $e9fe;graphikendeanforderung ruecksetzen
3070 k1 lda $64;zeichen laden
3080 jsr h3;und der graphikroutine ueberreichen
3130 k2 jsr in;naechstes zeichen abholen
3140 bvc k1;neue sa nein, dann weiter graphik
3160 ldy #$8d;sonst letzte zeile drucken
3170 jsr h6
3180 k3 lda $7a;schon auf papier
3190 bne k3;nein, dann warten
3200 lda port;sonst rom zeichensatz einschalten
3210 ora #$10
3220 sta port
3280 jmp $ed26;ende
4000 ;*** 7bit-graphik chr$(8) ***
4010 j1 cmp #$08;chr$(8) = graphik ein empfangen
4020 bne h1;nein dann weiter untersuchen
4030 lda port;sonst ram im zeichensatzbereich ein
4040 and #$ef
4050 sta port
4052 lda #$00;skip space im ram loeschen
4054 ldx #$07; damit tabulatorfunktion auch im
4056 h0 sta $0900,x;graphikmodus funktioniert
4058 dex
4059 bpl h0
4060 lda #$12;zeilenabstand graphikkonform setzen
4070 sta $86
4080 sta $e9fe;graphikendeanforderung ruecksetzen
4090 sta $e9ff;graphikmodus anzeigen
4100 rts;zurueck zu sa0
4150 h1 ldx $e9ff;graphik eingeschaltet
4160 cpx #$12
4170 beq h2;ja, dann graphikbehandlung
4180 jmp out;sonst ausgabe wie gewohnt
4190 h2 cmp #$80;ists ein steuerzeichen
4195 and #$7f;msb loeschen
4200 bcs h3;als graphikzeichen verarbeiten
4210 cmp #$0e;chr$(14)
4220 beq h4;ja, dann graphikende beantragen
4230 cmp #$0f;chr$(15)
4240 bne h5;nein, dann weiter untersuchen
4250 h4 sta $e9fe;graphikende anfordern
4260 lda #$24
4270 sta $86;zeilenabstand korrigieren
4280 rts;weiter mit sa0
4300 h6 lda $82;zeile abschliessen
4310 beq h7;zahl der spalten durch 8 teilbar
4320 h8 lda #$00;sonst auf ganzes zeichen ergaenzen
4330 jsr h3
4340 lda $82
4350 bne h8
4360 h7 sta $80;register ruecksetzen
4370 sta $81
4380 sta $83
4390 tya
4400 jsr out;zeilenende signalisieren
4410 lda $e9fe
4420 cmp #$12;graphikende angefordert
4430 beq h9;nein, dann zurueck zu sa0
4435 h22 lda $7a;sonst warten, bis mechanik fertig
4436 bne h22
4440 lda port;und zeichensatz-rom einschalten
4450 ora #$10
4460 sta port
4470 lda #$24
4480 sta $e9ff
4490 h9 rts;zurueck zu sa0
4500 h5 jsr $efa2;auf terminator untersuchen
4510 tay
4520 h20 bcs h6;zeile ausdrucken falls terminator
4530 cmp #$1a;chr$(26) = zeichen mehrfach drucken
4540 bne h10;nein, dann weiter untersuchen
4550 jsr in;anzahl holen
4560 sta $85
4570 jsr in;zeichen holen
4573 lda $64
4574 bpl h12;ende, falls nicht gueltiges zeichen
4575 and #$7f;msb loeschen
4580 sta $7f
4590 h11 lda $7f
4600 jsr h3;zeichen so oft ausgeben wie verlangt
4610 dec $85
4620 bne h11
4630 h12 rts;zurueck zu sa0
4640 h10 cmp #$0c;chr$(12) = formfeed
4650 bne h12;zurueck zu sa0 falls nicht
4660 tay
4670 jmp h6;sonst zeile beenden
4700 h3 ldx #$00;graphikzeichenverarbeitung
4705 stx $84
4710 ldx #$08
4715 h13 ror a;zeichen umdrehen
4720 rol $84
4725 dex
4730 bne h13
4735 h23 lda $81
4740 cmp #$e4;erstes zeichen
4745 bcs h14
4750 adc #$e4;ja dann adressoffset addieren
4755 sta $81
4760 h14 lda $84
4762 ldx #$00
4765 sta ($80,x);zeichen in ram
4770 inc $80
4775 bne h15
4780 inc $81
4785 h15 dec $82
4790 bpl h12;jeweils 8 zeichen geben eins im puffer
4800 lda #$4f;80 zeichen pro zeile
4802 ldx $65
4805 cpx #$0e;sa 14
4807 beq h21
4810 lda #$3b;sonst nur 60 zeichen
4812 h21 cmp $83
4815 bcs h16;zeilenende nicht erreicht
4817 ldy #$0d
4818 lda #$00
4819 sta $82
4820 jsr h7;zeile abschliessen
4821 h24 lda $7a
4822 bne h24;ausdruck abwarten
4823 jmp h23;neue zeile beginnen
4825 h16 ldx #$07;zaehler 0..7 ruecksetzen
4830 stx $82
4835 lda $83;umrechnung zeichensatzplatz in ascii
4840 cmp #$20
4845 bcs h18
4850 adc #$40
4855 bcc h19
4860 h18 cmp #$40
4865 bcc h19
4870 adc #$1f
4875 h19 inc $83
4880 jmp out;ascii code in puffer
5000 *= $7f00;*** sa15 hexdumpmode ***
5010 g1 jsr in
5020 bvs g6
5030 j7 jsr $efa2; ** _ ** einsprung hier !
5040 bcc g1;auf terminator warten
5050 g4 jsr in;zeichen holen
5060 bvs g2;falls sa gewechselt, diese ausgeben
5070 g5 lda $64;sonst zeichen laden,
5080 sta $80;sichern,
5090 jsr g3;hexcode berechnen und ausgeben
5100 jmp g4;naechstes zeichen
5110 g2 lda #$0d;neue sa mit
5120 jsr out;neuer zeile
5130 lda #$2a;und sternchen wuerdigen
5140 jsr out
5150 clv
5160 lda $65;sa laden,
5170 sta $80;sichern,
5180 jsr g3;hexcode berechnen und ausgeben
5190 jmp g5;zugehoeriges zeichen hinterher
5200 g6 jmp $ee80;terminator error
5210 g3 lsr a;highnibble berechnen
5220 lsr a
5230 lsr a
5240 lsr a
5250 jsr g7;und ausgeben
5260 lda $80;lownibble berechnen
5270 and #$0f
5280 jsr g7;und ausgeben
5290 lda #$20;leerzeichen
5300 jsr out;zweimal
5310 jsr out;zwischen zwei bytes ausgeben
5320 rts
5330 g7 clc;nibble in hexadezimaldarstellung
5340 adc #$30;verkleiden
5350 cmp #$3a
5360 bcc g8
5370 adc #$06
5380 g8 jsr out;und in druckerpuffer druecken
5390 rts
8000 *= $7ff1;resetvektor
8010 lda #$ff;reset einsprung
8020 sta port;alle portpins auf high
8030 sta $0242;alle portpins als ausgaenge
8040 jmp $ea31;zum alten einsprung
8050 .word $fff1;neuer resetvektor